perm filename WIX2SB.FAI[VIS,HPM] blob
sn#194320 filedate 1975-12-28 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00020 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 TITLE WIX2SB
C00006 00003 AR2TAB: MOVEI T,44 TOTAL BITS/WORD
C00008 00004 HAFPIC: POP P,RETAD
C00012 00005 GETPAR: POP P,RETAD
C00013 00006 PERBIT: POP P,RETAD
C00014 00007 HISTOG: POP P,RETAD
C00016 00008 ROWSUM: POP P,RETAD
C00017 00009 UNPACK: POP P,RETAD UNPACK A DENSE BYTE ARRAY INTO A PICTURE
C00018 00010 SELECT: POP P,RETAD copy a piece of a picture into another
C00020 00011 ROWSUD: POP P,RETAD much quicker and dirtier than ROWSUM
C00021 00012 DEFINE SHFT1 <TEMP+1>
C00025 00013 COPPIC: POP P,RETAD COPIES A PICTURE IN PIC1
C00026 00014
C00038 00015 CENTRO: POP P,RETAD find centroid of black area in a window
C00040 00016 PRGEND
C00041 00017 TITLE MATCH
C00052 00018 TITLE NORCOR
C00064 00019 TITLE SHRINK
C00067 00020 TITLE TEMP
C00068 ENDMK
C⊗;
TITLE WIX2SB
;FULLY FORMAT 2 ORIENTED PICTURE ROUTINES. EXTENSIONS TO THE CONVERTED
;FORMAT 1 ROUTINES IN WIXSUB
ENTRY HAFPIC,COPPIC,GETPAR,PERBIT,HISTOG,CMPPAR,ROWSUM,ROWSUD
ENTRY UNPACK,SELECT
EXTERN CORGET,CORREL
EXTERN SQRS,TEMP
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BPTAB←←12
LINTAB←←13
T←1 ↔ TT←2 ↔ TTT←3 ↔ ARRY1←4 ↔ ARRY2←5 ↔ P←17
A←6 ↔ B←7 ↔ C←10 ↔ D←11 ↔ E←13 ↔ F←14 ↔ G←15
RETAD: 0
AR2TAB: MOVEI T,44 ;TOTAL BITS/WORD
IDIV T,BYBI(ARRY2) ;BYTE SIZE
MOVEM T,WDBY(ARRY2) ;BYTES PER WORD
SUBI TT,44 ;-NUMBER OF USED BITS/WORD
MOVNM TT,WDBI(ARRY2) ;SAVED
ADD T,LNBY(ARRY2)
SUBI T,1
IDIV T,WDBY(ARRY2) ;NUMBER OF WORDS/SCANLINE
MOVEM T,LNWD(ARRY2)
MOVE TT,T ;WORDS/LINE
IMUL TT,WDBY(ARRY2) ;BYTES/WORD
MOVEM TT,LNBYA(ARRY2) ;GIVES BYTES/LINE, INCLUDING NULLS
IMUL TT,PCLN(ARRY2)
MOVEM TT,PCBYA(ARRY2) ;TOTAL BYTES/PIC, INCL. NULLS
IMUL T,PCLN(ARRY2) ;LINES IN THE PICTURE
MOVEM T,PCWD(ARRY2) ;WORDS IN THE PICTURE
MOVE T,LNBY(ARRY2)
IMUL T,PCLN(ARRY2)
MOVEM T,PCBY(ARRY2) ;BYTES/PIC, NOT INCL. NULLS
MOVEI T,14(ARRY2)
ADD T,PCLN(ARRY2)
MOVEM T,BPTAB(ARRY2) ;ADDRESS OF BYTE POINTER TABLE
ADD T,LNBYA(ARRY2) ;ADDR OF FIRST WORD IN PICTURE
MOVN TT,PCLN(ARRY2) ;SET UP CNTR FOR LINE ADDRESSES
HRL TT,TT
HRRI TT,LINTAB(ARRY2)
LTLP: MOVEM T,(TT) ;MAKE LINE TABLE
ADD T,LNWD(ARRY2)
AOBJN TT,LTLP
MOVN TT,BPTAB(ARRY2)
HRL TT,LNBYA(ARRY2) ;SET UP CNTR FOR BYTE TABLE
AOBJN TT, ;DECR ADDRESS AND INCR COUNT BY 1
MOVN TT,TT
MOVEI T,4400
ADD T,BYBI(ARRY2)
LSH T,6
HRLZ T,T
BYLP: MOVEM T,(TT) ;MAKE BYTE POINTER TABLE
IBP T
AOBJN TT,BYLP
POPJ P,
HAFPIC: POP P,RETAD
POP P,G ;MAXBIT
POP P,ARRY2 ;MAKES A HALFSIZE VERSION
POP P,ARRY1 ;OF A PICTURE
MOVE T,LNBY(ARRY1) ;HAFPIC(PICIN,PICOUT,BITMAX);
ASH T,-1 ;NEW PIC IS HALF THE WIDTH
MOVEM T,LNBY(ARRY2)
MOVE T,PCLN(ARRY1)
ASH T,-1 ;AND HALF THE HEIGHT
MOVEM T,PCLN(ARRY2)
MOVE T,BYBI(ARRY1)
ADDI T,2 ;AND HAS TWO MORE BITS/PIXEL
SUB G,T ;UNLESS LIMITED TO LESS
JUMPGE G,.+2
ADD T,G
MOVEM T,BYBI(ARRY2)
PUSHJ P,AR2TAB ;SET UP ITS SKELETON
MOVE A,BPTAB(ARRY1)
MOVE A,-1(A) ;FIRST BYTE PNTR FOR ARRY1
ADD A,LINTAB(ARRY1)
MOVE B,BPTAB(ARRY2)
MOVE B,-1(B) ;AND FIRST BP FOR ARRY2
ADD B,LINTAB(ARRY2)
MOVE F,PCLN(ARRY2) ;NO OF LINES, FOR COUNT
;IF NOT NEEDED TO REDUCE BITS/BYTE
JUMPGE G,[ LNLP: MOVE TTT,LNBY(ARRY2) ;NO OF BYTES, INNER LOOP CNTR
MOVE C,A
ADD A,LNWD(ARRY1) ;BP S FOR ARRY1
MOVE D,A
ADD A,LNWD(ARRY1)
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY2)
CLLP: ILDB T,C ;FETCH FOUR BYTES AND ADD THEM
ILDB TT,C
ADD T,TT
ILDB TT,D
ADD T,TT
ILDB TT,D
ADD T,TT
IDPB T,E ;THEN DEPOSIT SUM
SOJG TTT,CLLP
SOJG F,LNLP
JRST @RETAD ]
LNLP1: MOVE TTT,LNBY(ARRY2) ;NO OF BYTES, INNER LOOP CNTR
MOVE C,A
ADD A,LNWD(ARRY1) ;BP S FOR ARRY1
MOVE D,A
ADD A,LNWD(ARRY1)
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY2)
CLLP1: ILDB T,C ;FETCH FOUR BYTES AND ADD THEM
ILDB TT,C
ADD T,TT
ILDB TT,D
ADD T,TT
ILDB TT,D
ADD T,TT
LSH T,(G) ;TRUNCATE TO CORRECT # OF BITS
IDPB T,E ;THEN DEPOSIT SUM
SOJG TTT,CLLP1
SOJG F,LNLP1
JRST @RETAD
GETPAR: POP P,RETAD
POP P,ARRY2 ;COPIES A FULL WORD ARRAY
POP P,ARRY1 ;INTO A PICTURE
MOVE B,BPTAB(ARRY2)
MOVE B,-1(B) ;AND FIRST BP FOR ARRY2
ADD B,LINTAB(ARRY2)
MOVE F,PCLN(ARRY2) ;NO OF LINES, FOR COUNT
LNLPG: MOVE TTT,LNBY(ARRY2) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY2)
CLLPG: MOVE T,(ARRY1) ;FETCH A WORD
ADDI ARRY1,1
IDPB T,E ;AND DEPOSIT A BYTE
SOJG TTT,CLLPG
SOJG F,LNLPG
JRST @RETAD
PERBIT: POP P,RETAD
POP P,ARRY2 ;transform ;TRANSFORMS EACH SAMPLE OF A
POP P,ARRY1 ;picture ;PICTURE ACCORDING TO A TABLE
HRRM ARRY2,ARF
MOVE B,BPTAB(ARRY1)
MOVE B,-1(B) ;AND FIRST BP FOR ARRY2
ADD B,LINTAB(ARRY1)
MOVE F,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPP: MOVE TTT,LNBY(ARRY1) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
CLLPP: ILDB T,E ;FETCH A SAMPLE
ARF: MOVE T,(T) ;altered to <ARRY2>(T)
DPB T,E ;AND DEPOSIT IT
SOJG TTT,CLLPP
SOJG F,LNLPP
JRST @RETAD
HISTOG: POP P,RETAD
POP P,ARRY2 ;HISTOGRAM ;MAKES A HISTOGRAM OF THE
POP P,ARRY1 ;picture ;GREY LEVELS IN A PICTURE
HRRM ARRY2,ARFG
HRRM ARRY2,ARFH
MOVEI A,1
LSH A,@BYBI(ARRY1)
SUBI A,1
ARFH: SETZM (A) ;CLEAR THE ARRAY
SOJGE A,ARFH
MOVE B,BPTAB(ARRY1)
MOVE B,-1(B) ;AND FIRST BP FOR ARRY2
ADD B,LINTAB(ARRY1)
MOVE F,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPH: MOVE TTT,LNBY(ARRY1) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
CLLPH: ILDB T,E ;FETCH A SAMPLE
ARFG: AOS (T) ;altered to <ARRY2>(T)
SOJG TTT,CLLPH
SOJG F,LNLPH
JRST @RETAD
ROWSUM: POP P,RETAD
POP P,ARRY2 ;ROW SUMS ;calculates the sum of each row of a pict
POP P,ARRY1 ;picture
HRRM ARRY2,ARFS
MOVE B,BPTAB(ARRY1)
MOVE B,-1(B) ;AND FIRST BP FOR ARRY2
ADD B,LINTAB(ARRY1)
MOVE F,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPS: MOVE TTT,LNBY(ARRY1) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
SETZM @ARFS
CLLPS: ILDB T,E ;FETCH A SAMPLE
ARFS: ADDM T,0 ;altered to <ARRY2>(TTT)
SOJG TTT,CLLPS
AOS ARFS
SOJG F,LNLPS
JRST @RETAD
UNPACK: POP P,RETAD ; UNPACK A DENSE BYTE ARRAY INTO A PICTURE
POP P,ARRY1 ;destination picture
POP P,ARRY2 ;original packed array
MOVE C,BPTAB(ARRY1)
ADD ARRY2,-1(C) ;construct byte pntr for source array
MOVE B,BPTAB(ARRY1)
MOVE B,-1(B) ;AND FIRST BP FOR destination
ADD B,LINTAB(ARRY1)
MOVE F,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPU: MOVE TTT,LNBY(ARRY1) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
CLLPU: ILDB T,C
IDPB T,E ;MOVE A SAMPLE
SOJG TTT,CLLPU
SOJG F,LNLPU
JRST @RETAD
SELECT: POP P,RETAD ;copy a piece of a picture into another
POP P,ARRY2 ;destination picture
POP P,B ;XEDGE
POP P,A ;YEDGE
POP P,ARRY1 ;source picture, part of which is to be copied
ADD B,BPTAB(ARRY1) ;SYNTHESIZE BYTE POINTER
MOVE B,-1(B) ;FOR SOURCE ARRAY
ADDI A,LINTAB(ARRY1)
ADD B,(A)
MOVE A,BPTAB(ARRY2)
MOVE A,-1(A) ;AND FIRST BP FOR destination
ADD A,LINTAB(ARRY2)
MOVE D,BYBI(ARRY2)
SUB D,BYBI(ARRY1)
MOVE F,PCLN(ARRY2) ;NO OF LINES, FOR COUNT
LNLPL: MOVE TTT,LNBY(ARRY2) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
MOVE C,A
ADD A,LNWD(ARRY2)
CLLPL: ILDB T,E
LSH T,(D)
IDPB T,C ;MOVE A SAMPLE
SOJG TTT,CLLPL
SOJG F,LNLPL
JRST @RETAD
ROWSUD: POP P,RETAD ;much quicker and dirtier than ROWSUM
POP P,ARRY2 ;ROW SUMS ;roughly calculates row sums
POP P,ARRY1 ;picture
SUBI ARRY2,1
MOVN B,LNWD(ARRY1)
MOVE TTT,LINTAB(ARRY1)
MOVE F,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPD: HRL TTT,B ;NO OF WORDS, INNER LOOP CNTR
MOVEI TT,0
CLLPD: HLRZ T,(TTT) ;FETCH A SAMPLE, SORT OF
ADD TT,T
AOBJN TTT,CLLPD
PUSH ARRY2,TT
SOJG F,LNLPD
JRST @RETAD
DEFINE SHFT1 <TEMP+1>
CMPPAR: POP P,RETAD
POP P,ARRY2 ;picture y ;compares two pictures
POP P,ARRY1 ;picture x ;sigma(xi-yi)↑2/n
MOVE B,BPTAB(ARRY1)
MOVE B,-1(B) ;FIRST BP FOR ARRY1
ADD B,LINTAB(ARRY1)
MOVE C,BPTAB(ARRY2)
MOVE C,-1(C) ;AND FIRST BP FOR ARRY2
ADD C,LINTAB(ARRY2)
MOVEI T,5 ;CALCULATE NORMALIZATION SHIFT
SUB T,BYBI(ARRY1) ;FOR MAKING SAMPLES 5 BITS
HRRZM T,SHFT1
MOVEI A,0 ;INITIALIZE SUM
MOVE G,PCLN(ARRY1) ;NO OF LINES, FOR COUNT
LNLPC: MOVE TTT,LNBY(ARRY1) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
MOVE F,C
ADD C,LNWD(ARRY2)
CLLPC: ILDB T,E ;FETCH A SAMPLE
ILDB TT,F
SUB T,TT
ASH T,@SHFT1
ADD A,SQRS(T) ;and add (xi-yi)↑2 to A
SOJG TTT,CLLPC
SOJG G,LNLPC
TLZ A,777774
IDIV A,PCLN(ARRY1)
IDIV A,LNBY(ARRY1)
MOVE 1,A
JRST @RETAD
COPPIC: POP P,RETAD ;COPIES A PICTURE IN PIC1
POP P,ARRY2 ;INTO PIC2 (THE LINE TABLE MUST
POP P,ARRY1 ;BE ADJUSTED TO DO THIS)
HRLZ T,ARRY1 ; COPPIC(PIC1,PIC2)
HRR T,ARRY2
MOVEI TT,13(ARRY2)
ADD TT,PCLN(ARRY1)
ADD TT,LNBYA(ARRY1)
ADD TT,PCWD(ARRY1)
BLT T,(TT)
MOVE T,ARRY2
SUB T,ARRY1
MOVN TT,PCLN(ARRY1)
SUBI TT,1
HRLZ TT,TT
HRRI TT,BPTAB(ARRY2)
COPLP: ADDM T,(TT)
AOBJN TT,COPLP
JRST @RETAD
CENTRO: POP P,RETAD ;find centroid of black area in a window
POP P,E ;threshold
POP P,D ;X2
POP P,C ;Y2
POP P,B ;X1
POP P,A ;Y1
POP P,ARRY1 ;source picture
ADD B,BPTAB(ARRY1) ;SYNTHESIZE BYTE POINTER
MOVE B,-1(B) ;FOR SOURCE ARRAY
ADDI A,LINTAB(ARRY1)
ADD B,(A)
X2←←D ↔ Y2←←C ↔ X1←←B ↔ Y1←←A
CAMLE X1,X2 ;FIX UP LIMITS
EXCH X1,X2
CAMLE Y1,Y2
EXCH Y1,Y2
CAIL X2,0
CAML X1,LNBY(ARRY1)
JRST GUPP
CAIL Y2,0
CAML Y1,PCLN(ARRY1)
JRST GUPP
CAIGE X1,0
MOVEI X1,0
MOVE T,LNBY(ARRY1)
CAML X2,T
MOVEI X2,-1(T)
CAIGE Y1,0
MOVEI Y1,0
MOVE T,PCLN(ARRY1)
CAML Y2,T
MOVEI Y2,-1(T)
SUB Y2,Y1 ;NO OF LINES, FOR COUNT
SUB X2,X1 ;NO OF COLUMNS
LNLPCE: MOVE TTT,LNBY(ARRY2) ;NO OF BYTES, INNER LOOP CNTR
MOVE E,B ;BP FOR ARRY2
ADD B,LNWD(ARRY1)
MOVE C,A
ADD A,LNWD(ARRY2)
CLLPCE: ILDB T,E
LSH T,(D)
IDPB T,C ;MOVE A SAMPLE
SOJG TTT,CLLPCE
SOJG F,LNLPCE
JRST @RETAD
GUPP: ;GIVE UP
PRGEND
TITLE MATCH
ENTRY MATCH
EXTERN SQRS,CORGET,CORREL
EXTERN TEMP
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BPTAB←←12
LINTAB←←13
T←1 ↔ TT←2 ↔ TTT←3 ↔ ARRY1←4 ↔ ARRY2←5 ↔ P←17
A←6 ↔ B←7 ↔ C←10 ↔ D←11 ↔ E←13 ↔ F←14 ↔ G←15
X1←←A ↔ Y1←←B ↔ X2←←C ↔ Y2←←D
DEFINE AX1 <TEMP>
DEFINE AY1 <TEMP+1>
DEFINE AX2 <TEMP+2>
DEFINE AY2 <TEMP+3>
DEFINE BX1 <TEMP+4>
DEFINE BY1 <TEMP+5>
DEFINE BX2 <TEMP+6>
DEFINE BY2 <TEMP+7>
DEFINE SOUWIN <TEMP+10>
DEFINE DESWIN <TEMP+11>
DEFINE DEXSKP <TEMP+12>
DEFINE DEYSKP <TEMP+13>
DEFINE WSIZ1 <TEMP+14>
DEFINE DWSIZ <TEMP+15>
DEFINE WSIZY1 <TEMP+16>
DEFINE VARIAN <TEMP+17>
DEFINE SOUSIZ <TEMP+20>
DEFINE WSIZ <TEMP+21>
DEFINE DWSIZ <TEMP+22>
DEFINE SHFT1 <TEMP+23>
DEFINE SHFT2 <TEMP+24>
DEFINE RETAD <TEMP+25>
MATCH: POP P,RETAD
POP P,BX2 ;A CORRELATOR. FINDS THE BEST MATCH
POP P,BY2 ;TO RECTANGLE ARRY1(AX1:AX2,AY1:AY2)
POP P,BX1 ;IN ARRY2(BX1:BY1,BX2:BY2)
POP P,BY1 ;ALL ARGUMENT ARE BY REFERENCE. THE
POP P,ARRY2 ;A'S AND B'S MAY BE ADJUSTED TO MAKE
MOVE X1,@BX1 ;THINGS FIT
MOVE X2,@BX2 ; MATCH(PIC1,AX1,AY1,AX2,AY2,
MOVE Y1,@BY1 ; PIC2,BX1,BY1,BX2,BY2);
MOVE Y2,@BY2
FIXB: CAMLE X1,X2 ;FIRST FIX UP THE LIMITS SO
EXCH X1,X2 ;X1≤X2, X1≥0 X2<WIDTH ETC.
CAIGE X1,0
MOVEI X1,0
MOVE T,LNBY(ARRY2)
CAML X2,T
MOVEI X2,-1(T)
CAMLE Y1,Y2 ;SIMILAR FOR Y
EXCH Y1,Y2
CAIGE Y1,0
MOVEI Y1,0
MOVE T,PCLN(ARRY2)
CAML Y2,T
MOVEI Y2,-1(T)
CAMG X1,X2
CAMLE Y1,Y2
JRST FIXB
MOVEM X1,@BX1
MOVEM X2,@BX2
MOVEM Y1,@BY1
MOVEM Y2,@BY2
POP P,AX2 ;DO SAME FOR SOURCE WINDOW
POP P,AY2
POP P,AX1
POP P,AY1
POP P,ARRY1
MOVE X1,@AX1
MOVE X2,@AX2
MOVE Y1,@AY1
MOVE Y2,@AY2
MOVEI T,5 ;CALCULATE SHIFTS NEEDED TO
SUB T,BYBI(ARRY1) ;CHANGE BOTH WINDOWS TO
HRRZM T,SHFT1 ;FIVE BITS/SAMPLE (TO FIT THE SQUARES
MOVEI T,5 ;TABLE)
SUB T,BYBI(ARRY2)
HRRZM T,SHFT2
FIXA: CAMLE X1,X2 ;FIRST FIX UP THE LIMITS SO
EXCH X1,X2 ;X1≤X2, X1≥0 X2<WIDTH ETC.
CAIGE X1,0
MOVEI X1,0
MOVE T,LNBY(ARRY1)
CAML X2,T
MOVEI X2,-1(T)
CAMLE Y1,Y2 ;SIMILAR FOR Y
EXCH Y1,Y2
CAIGE Y1,0
MOVEI Y1,0
MOVE T,PCLN(ARRY1)
CAML Y2,T
MOVEI Y2,-1(T)
CAMG X1,X2
CAMLE Y1,Y2
JRST FIXA
MOVE T,@BX1 ;SHRINK SOURCE WINDOW SYMMETRICALLY
SUB T,@BX2 ;UNTIL IT IS NO
ADD T,X2 ;LARGER THAN DESTINATION WINDOW
SUB T,X1
JUMPLE T,YSHRNK
MOVEI TT,1(T)
ASHC T,-1
ADDI X1,(T)
SUBI X2,(TT)
YSHRNK: MOVE T,@BY1 ;SHRINK IN Y DIRECTION
SUB T,@BY2 ;UNTIL IT IS NO
ADD T,Y2 ;LARGER THAN DESTINATION WINDOW
SUB T,Y1
JUMPLE T,RESTA
MOVEI TT,1(T)
ASHC T,-1
ADDI Y1,(T)
SUBI Y2,(TT)
RESTA: MOVEM X1,@AX1
MOVEM Y1,@AY1
MOVEM X2,@AX2
MOVEM Y2,@AY2
THIS←←TT ↔ SIZ←←TTT
MOVEI SIZ,1(X2) ;CALCULATE SIZE OF BUFFER AREA
SUB SIZ,X1 ;FOR THE SOURCE WINDOW CODE
MOVEM SIZ,WSIZ1 ;WILL BE X WINDOWSIZE-1
MOVEM SIZ,WSIZ ;IS X WINDOWSIZ
MOVNM SIZ,DEXSKP ;WILL BE DELTA XB - DELTA XA
MOVEI T,1(Y2)
SUB T,Y1
MOVEM T,WSIZY1 ;WILL BE X WINDOWSIZE-1
MOVNM T,DEYSKP ;WIL BE DELTA YB - DELTA YA
IMUL SIZ,T
MOVEM SIZ,SOUSIZ ;SOURCE WINDOW SIZE (IN PIXELS)
ASH SIZ,1
ADDI SIZ,1
PUSHJ P,CORGET ;AND MAKE THAT BUFFER
HALT
MOVEM THIS,SOUWIN
SUBI THIS,1
MOVN T,T
HRLZ T,T
HRRI T,LINTAB(ARRY1) ;Y COUNTER
ADD T,Y1
MOVE 0,@BX2 ;FINISH UP MAKING DELTA XB -DELTA XA
SUB 0,@BX1
ADDI 0,1
MOVEM 0,DWSIZ
ADDM 0,DEXSKP
MOVE 0,@BY2 ;AND THE Y'S TOO
SUB 0,@BY1
ADDI 0,1
ADDM 0,DEYSKP
SOS WSIZ1 ;NOT TO MENTION X WINDOWSIZ-1
SOS WSIZY1 ;AND Y WINDOWSIZ-1
MOVE G,[MOVN TT,0(T)]
MOVE E,BPTAB(ARRY1) ;BP SKELETON
ADDI E,-1(X1)
MOVE E,(E)
SETZB B,A ;FOR SUM OF X AND X↑2, AS EXPLND BELOW
;DON'T FORGET! A,B,C,D ARE X1,X2,Y1,Y2 ALSO
ILYLP: MOVE F,E ;SETS UP IN LINE CODED
ADD F,(T) ;STUFF FOR THE INNER
MOVE TTT,WSIZ ;"LOOP" OF THE CORRELATION
ILXLP: PUSH THIS,G ;A SEQUENCE OF
ADDI G,1 ; MOVN TT,POSB(T)
ILDB C,F ; ADD A,SQRS+PIXEL(TT)
LSH C,@SHFT1
ADD B,C
ADD A,SQRS(C)
ADD C,[ADD A,SQRS(TT)]
PUSH THIS,C
SOJG TTT,ILXLP
ADD G,DEXSKP
AOBJN T,ILYLP
TLZ A,777774
PUSH THIS,[JRST INRDON] ;AND THE FINAL INSTR.
;CALCULATE SUM[(X-XBAR)↑2] ALSO. THIS IS SAME AS SUM[X↑2-2 X XBAR+XBAR↑2],
;WHICH IS SUM[X↑2]-2 XBAR SUM[X]+XBAR↑2*N OR, SINCE XBAR=SUM[X]/N,
;SUM[X↑2]-2(SUM[X])↑2/N+(SUM[X])↑2/N WHICH IS SUM[X↑2]-(SUM[X])↑2/N
; THIS QUANTITY WILL BE CALLED VARIANCE
IMUL B,B
IDIV B,SOUSIZ
SUB A,B
MOVEM A,VARIAN
MOVE X1,@BX1 ;MAKE THE DESTINATION
MOVE X2,@BX2 ;WINDOW BUFFER
MOVE Y1,@BY1
MOVE Y2,@BY2
MOVEI SIZ,1(X2)
SUB SIZ,X1
MOVEM SIZ,DWSIZ
MOVEI T,1(Y2)
SUB T,Y1
IMUL SIZ,T
PUSHJ P,CORGET
HALT
MOVEM THIS,DESWIN
SUBI THIS,1
MOVN T,T ;Y COUNTER
HRLZ T,T
HRRI T,LINTAB(ARRY2)
ADD T,Y1
MOVE E,BPTAB(ARRY2) ;BYTE POINTER SKELETON
ADDI E,-1(X1) ;FOR DESTINATION
MOVE E,(E)
BUYLP: MOVE F,E ;UNPACKS THE DESTINATION
ADD F,(T) ;WINDOW, ONE WORD/SAMPLE
MOVE TTT,DWSIZ
BUXLP: ILDB 0,F
LSH 0,@SHFT2
PUSH THIS,0
SOJG TTT,BUXLP
AOBJN T,BUYLP
MOVN B,DEXSKP ;NOW ACTUALLY CORRELATE
SUBI B,1
HRLZI D,377777 ;VALUE OF BEST MATCH IN D
MOVE E,DESWIN ;LOCATION IN E
MOVE C,DEYSKP ;NUMBER OF ROWS
MOVE T,DESWIN ;WHERE TO START
CRYLP: HRL T,B ;INIT X CNTR, BUT KEEP OLD POSN
CRXLP: MOVEI A,0 ;ACCUMULATE CURRENT SUM IN A
JRST @SOUWIN ;JUMP TO PREVIOUSLY CREATED CODE
INRDON: TLZ A,777774 ;clear sum field, leaving only square
CAML A,D ;SEE IF NEW SUM IS BETTER
JRST .+3
MOVE D,A ;IF SO, RECORD IT
HRRZ E,T
AOBJN T,CRXLP ;SHIFT IN X, AND TRY AGAIN
ADD T,WSIZ1 ;ADD WHATS NEEDED TO GET TO NEXT
SOJGE C,CRYLP ;SCANLINE, AND TRY AGAIN
SUB E,DESWIN ;DECOMPOSE SAVED BEST LOCATION
IDIV E,DWSIZ ;INTO X AND Y PARTS
ADDB E,@BY1 ;ACTUAL LOWER Y BOUND OF BEST MATCH
ADDB F,@BX1 ;ACTUAL LOWER X BOUND OF BEST MATCH
ADD F,WSIZ1 ;COMPUTE UPPER X BOUND
MOVEM F,@BX2 ;AND RETURN IT
ADD E,WSIZY1 ;UPPER Y BOUND
MOVEM E,@BY2 ;RETURNED
MOVE THIS,SOUWIN ;RETURN THE USED CORAGE
PUSHJ P,CORREL
MOVE THIS,DESWIN
PUSHJ P,CORREL
MOVE 1,D ;GET READY TO RETURN VALUE OF MATCH
ASH 1,4 ;SCALE IT UP BY 2↑4
IDIV 1,VARIAN ;NORMALIZE
JRST @RETAD ;AND RETURN
PRGEND
TITLE NORCOR
ENTRY NORCOR
EXTERN SQRS,CORGET,CORREL
EXTERN TEMP
DEFINE FLOAT(N)
< TLC N,232000
FADR N,N >
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BPTAB←←12
LINTAB←←13
T←1 ↔ TT←2 ↔ TTT←3 ↔ ARRY1←4 ↔ ARRY2←5 ↔ P←17
A←6 ↔ B←7 ↔ C←10 ↔ D←11 ↔ E←13 ↔ F←14 ↔ G←15
X1←←A ↔ Y1←←B ↔ X2←←C ↔ Y2←←D
DEFINE AX1 <TEMP>
DEFINE AY1 <TEMP+1>
DEFINE AX2 <TEMP+2>
DEFINE AY2 <TEMP+3>
DEFINE BX1 <TEMP+4>
DEFINE BY1 <TEMP+5>
DEFINE BX2 <TEMP+6>
DEFINE BY2 <TEMP+7>
DEFINE SOUWIN <TEMP+10>
DEFINE DESWIN <TEMP+11>
DEFINE DEXSKP <TEMP+12>
DEFINE DEYSKP <TEMP+13>
DEFINE WSIZ1 <TEMP+14>
DEFINE DWSIZ <TEMP+15>
DEFINE WSIZY1 <TEMP+16>
DEFINE SIGX <TEMP+17>
DEFINE SOUSIZ <TEMP+20>
DEFINE WSIZ <TEMP+21>
DEFINE DWSIZ <TEMP+22>
DEFINE SHFT1 <TEMP+23>
DEFINE SHFT2 <TEMP+24>
DEFINE SIGXX <TEMP+25>
DEFINE RETAD <TEMP+26>
DEFINE SSIGX <TEMP+27>
NORCOR: POP P,RETAD
POP P,BX2 ;A CORRELATOR. FINDS THE BEST MATCH
POP P,BY2 ;TO RECTANGLE ARRY1(AX1:AX2,AY1:AY2)
POP P,BX1 ;IN ARRY2(BX1:BY1,BX2:BY2)
POP P,BY1 ;ALL ARGUMENT ARE BY REFERENCE. THE
POP P,ARRY2 ;A'S AND B'S MAY BE ADJUSTED TO MAKE
MOVE X1,@BX1 ;THINGS FIT
MOVE X2,@BX2 ; NORCOR(PIC1,AX1,AY1,AX2,AY2,
MOVE Y1,@BY1 ; PIC2,BX1,BY1,BX2,BY2);
MOVE Y2,@BY2
FIXB: CAMLE X1,X2 ;FIRST FIX UP THE LIMITS SO
EXCH X1,X2 ;X1≤X2, X1≥0 X2<WIDTH ETC.
CAIGE X1,0
MOVEI X1,0
MOVE T,LNBY(ARRY2)
CAML X2,T
MOVEI X2,-1(T)
CAMLE Y1,Y2 ;SIMILAR FOR Y
EXCH Y1,Y2
CAIGE Y1,0
MOVEI Y1,0
MOVE T,PCLN(ARRY2)
CAML Y2,T
MOVEI Y2,-1(T)
CAMG X1,X2
CAMLE Y1,Y2
JRST FIXB
MOVEM X1,@BX1
MOVEM X2,@BX2
MOVEM Y1,@BY1
MOVEM Y2,@BY2
POP P,AX2 ;DO SAME FOR SOURCE WINDOW
POP P,AY2
POP P,AX1
POP P,AY1
POP P,ARRY1
MOVE X1,@AX1
MOVE X2,@AX2
MOVE Y1,@AY1
MOVE Y2,@AY2
MOVEI T,5 ;CALCULATE SHIFTS NEEDED TO
SUB T,BYBI(ARRY1) ;CHANGE BOTH WINDOWS TO
HRRZM T,SHFT1 ;FIVE BITS/SAMPLE (TO FIT THE SQUARES
MOVEI T,5 ;TABLE)
SUB T,BYBI(ARRY2)
HRRZM T,SHFT2
FIXA: CAMLE X1,X2 ;FIRST FIX UP THE LIMITS SO
EXCH X1,X2 ;X1≤X2, X1≥0 X2<WIDTH ETC.
CAIGE X1,0
MOVEI X1,0
MOVE T,LNBY(ARRY1)
CAML X2,T
MOVEI X2,-1(T)
CAMLE Y1,Y2 ;SIMILAR FOR Y
EXCH Y1,Y2
CAIGE Y1,0
MOVEI Y1,0
MOVE T,PCLN(ARRY1)
CAML Y2,T
MOVEI Y2,-1(T)
CAMG X1,X2
CAMLE Y1,Y2
JRST FIXA
MOVE T,@BX1 ;SHRINK SOURCE WINDOW SYMMETRICALLY
SUB T,@BX2 ;UNTIL IT IS NO
ADD T,X2 ;LARGER THAN DESTINATION WINDOW
SUB T,X1
JUMPLE T,YSHRNK
MOVEI TT,1(T)
ASHC T,-1
ADDI X1,(T)
SUBI X2,(TT)
YSHRNK: MOVE T,@BY1 ;SHRINK IN Y DIRECTION
SUB T,@BY2 ;UNTIL IT IS NO
ADD T,Y2 ;LARGER THAN DESTINATION WINDOW
SUB T,Y1
JUMPLE T,RESTA
MOVEI TT,1(T)
ASHC T,-1
ADDI Y1,(T)
SUBI Y2,(TT)
RESTA: MOVEM X1,@AX1
MOVEM Y1,@AY1
MOVEM X2,@AX2
MOVEM Y2,@AY2
THIS←←TT ↔ SIZ←←TTT
MOVEI SIZ,1(X2) ;CALCULATE SIZE OF BUFFER AREA
SUB SIZ,X1 ;FOR THE SOURCE WINDOW CODE
MOVEM SIZ,WSIZ1 ;WILL BE X WINDOWSIZE-1
MOVEM SIZ,WSIZ ;IS X WINDOWSIZ
MOVNM SIZ,DEXSKP ;WILL BE DELTA XB - DELTA XA
MOVEI T,1(Y2)
SUB T,Y1
MOVEM T,WSIZY1 ;WILL BE X WINDOWSIZE-1
MOVNM T,DEYSKP ;WIL BE DELTA YB - DELTA YA
IMUL SIZ,T
MOVEM SIZ,SOUSIZ ;SOURCE WINDOW SIZE (IN PIXELS)
IMULI SIZ,3
ADDI SIZ,1
PUSHJ P,CORGET ;AND MAKE THAT BUFFER
HALT
MOVEM THIS,SOUWIN
SUBI THIS,1
MOVN T,T
HRLZ T,T
HRRI T,LINTAB(ARRY1) ;Y COUNTER
ADD T,Y1
MOVE 0,@BX2 ;FINISH UP MAKING DELTA XB -DELTA XA
SUB 0,@BX1
ADDI 0,1
MOVEM 0,DWSIZ
ADDM 0,DEXSKP
MOVE 0,@BY2 ;AND THE Y'S TOO
SUB 0,@BY1
ADDI 0,1
ADDM 0,DEYSKP
SOS WSIZ1 ;NOT TO MENTION X WINDOWSIZ-1
SOS WSIZY1 ;AND Y WINDOWSIZ-1
MOVE G,[MOVN TT,0(T)]
MOVE E,BPTAB(ARRY1) ;BP SKELETON
ADDI E,-1(X1)
MOVE E,(E)
SETZB B,A ;FOR SUM OF X AND X↑2, AS EXPLND BELOW
;DON'T FORGET! A,B,C,D ARE X1,X2,Y1,Y2 ALSO
ILYLP: MOVE F,E ;SETS UP IN LINE CODED
ADD F,(T) ;STUFF FOR THE INNER
MOVE TTT,WSIZ ;"LOOP" OF THE CORRELATION
ILXLP: PUSH THIS,G ;A SEQUENCE OF
ADDI G,1 ; MOVN TT,POSB(T)
ILDB C,F ; ADD A,SQRS+PIXEL(TT)
LSH C,@SHFT1
ADD A,SQRS(C)
ADD C,[ADD A,SQRS(TT)]
PUSH THIS,C
PUSH THIS,[ADD F,SQRS(TT)]
SOJG TTT,ILXLP
ADD G,DEXSKP
AOBJN T,ILYLP
PUSH THIS,[JRST INRDON] ;AND THE FINAL INSTR.
HLRE B,A
ASH B,-2
MOVEM B,SIGX ; SIGMA(X)
TLZ A,777774
MOVEM A,SIGXX ; SIGMA(X↑2)
IMUL B,B
MOVEM B,SSIGX ;SIGMA(X) ↑ 2
MOVE X1,@BX1 ;MAKE THE DESTINATION
MOVE X2,@BX2 ;WINDOW BUFFER
MOVE Y1,@BY1
MOVE Y2,@BY2
MOVEI SIZ,1(X2)
SUB SIZ,X1
MOVEM SIZ,DWSIZ
MOVEI T,1(Y2)
SUB T,Y1
IMUL SIZ,T
PUSHJ P,CORGET
HALT
MOVEM THIS,DESWIN
SUBI THIS,1
MOVN T,T ;Y COUNTER
HRLZ T,T
HRRI T,LINTAB(ARRY2)
ADD T,Y1
MOVE E,BPTAB(ARRY2) ;BYTE POINTER SKELETON
ADDI E,-1(X1) ;FOR DESTINATION
MOVE E,(E)
BUYLP: MOVE F,E ;UNPACKS THE DESTINATION
ADD F,(T) ;WINDOW, ONE WORD/SAMPLE
MOVE TTT,DWSIZ
BUXLP: ILDB 0,F
LSH 0,@SHFT2
PUSH THIS,0
SOJG TTT,BUXLP
AOBJN T,BUYLP
MOVN B,DEXSKP ;NOW ACTUALLY CORRELATE
SUBI B,1
MOVE D,[-1.0] ;VALUE OF BEST MATCH IN D
MOVE E,DESWIN ;LOCATION IN E
MOVE C,DEYSKP ;NUMBER OF ROWS
MOVE T,DESWIN ;WHERE TO START
CRYLP: HRL T,B ;INIT X CNTR, BUT KEEP OLD POSN
CRXLP: SETZB A,F ;SIG((X-Y)↑(1,2))→A, SIG(Y↑(1,2))→F
JRST @SOUWIN ;JUMP TO PREVIOUSLY CREATED CODE
INRDON: HLRE TT,F
ASH TT,-2 ;EXTRACT SIG(-Y)=-SIG(Y)
TLZ F,777774 ;AND SIG(Y↑2)
ADD F,SIGXX ;NOW SIG(Y↑2)+SIG(X↑2)
IMUL F,SOUSIZ ;NOW N*(SIG(X↑2)+SIG(Y↑2))
TLZ A,777774 ;FORM SIG((X-Y)↑2)
IMUL A,SOUSIZ ;NOW N*SIG((X-Y)↑2)
MOVN TTT,TT ;COPY SIG(Y)
IMUL TTT,SIGX ;FORM SIG(Y)*SIG(X)
ADD A,TTT ;NOW N*SIG((X-Y)↑2)+SIG(Y)*SIG(X)
ADD A,TTT ;NOW N*SIG((X-Y)↑2)+2*SIG(Y)*SIG(X)
SUB A,F ;N*S((X-Y)↑2)+2*S(Y)*S(X)-N*(S(X↑2)+S(Y↑2))
IMUL TT,TT ;FORM SIG(Y)↑2
ADD TT,SSIGX ;NOW SIG(X)↑2+SIG(Y)↑2
SUB TT,F ;NOW S(X)↑2+S(Y)↑2-N*(S(X↑2)+S(Y↑2))
FLOAT (A) ;CONVERT NUMERATOR TO FLOATING
FLOAT (TT) ;CONVERT DENOMINATOR TO FLOATING
FDVR A,TT ;FORM QUOTIENT
CAMG A,D ;SEE IF NEW MEASURE IS BETTER
JRST .+3
MOVE D,A ;IF SO, RECORD IT
HRRZ E,T
AOBJN T,CRXLP ;SHIFT IN X, AND TRY AGAIN
ADD T,WSIZ1 ;ADD WHATS NEEDED TO GET TO NEXT
SOJGE C,CRYLP ;SCANLINE, AND TRY AGAIN
SUB E,DESWIN ;DECOMPOSE SAVED BEST LOCATION
IDIV E,DWSIZ ;INTO X AND Y PARTS
ADDB E,@BY1 ;ACTUAL LOWER Y BOUND OF BEST MATCH
ADDB F,@BX1 ;ACTUAL LOWER X BOUND OF BEST MATCH
ADD F,WSIZ1 ;COMPUTE UPPER X BOUND
MOVEM F,@BX2 ;AND RETURN IT
ADD E,WSIZY1 ;UPPER Y BOUND
MOVEM E,@BY2 ;RETURNED
MOVE THIS,SOUWIN ;RETURN THE USED CORAGE
PUSHJ P,CORREL
MOVE THIS,DESWIN
PUSHJ P,CORREL
MOVE 1,D ;GET READY TO RETURN VALUE OF MATCH
JRST @RETAD ;AND RETURN
PRGEND
TITLE SHRINK
ENTRY SHRINK
EXTERN CORGET,CORREL,TEMP
DEFINE RETAD <TEMP>
DEFINE XTAB <TEMP+1>
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BPTAB←←12
LINTAB←←13
T←1 ↔ TT←2 ↔ TTT←3 ↔ ARRY1←4 ↔ ARRY2←5 ↔ P←17
A←6 ↔ B←7 ↔ C←10 ↔ D←11 ↔ E←13 ↔ F←14 ↔ G←15
THIS←←TT ↔ SIZ←←TTT
SHRINK: POP P,RETAD
POP P,ARRY2
POP P,ARRY1
HRLZ T,LNBY(ARRY1) ;FIGURE HOW MANY PIXELS IN X OF ARRY1
IDIV T,LNBY(ARRY2) ;GO INTO ARRY2
MOVE SIZ,LNBY(ARRY2) ;MAKE A BPTR TABLE ENTRY FOR ARRY2
PUSHJ P,CORGET ;GET CORE FOR IT
HALT
MOVEM THIS,XTAB ;SAVE BPTR ADDRESSES
MOVN A,LNBY(ARRY2) ;SET UP COUNT
HRL THIS,A
HRLZ B,BPTAB(ARRY1) ;ADDRESS OF BPTR TABLE OF PIC1
MOVE F,T
ASH F,-1
ADD B,F
LNLP: HLRZ C,B ;GET INTEGER PART
MOVE C,(C) ;GET ITS POINTER
MOVEM C,(THIS) ;SAVE IT IN XTABLE
ADD B,T ;FIND NEXT ADDRESS
AOBJN THIS,LNLP ;AND LOOP
MOVE G,BYBI(ARRY2) ;CALCULATE RELATIVE SHIFT COUNT
SUB G,BYBI(ARRY1)
HRLZ T,PCLN(ARRY1) ;CALCULATE PARAMETERS FOR Y LOOP
IDIV T,PCLN(ARRY2)
MOVN A,PCLN(ARRY2) ;SET UP COUNT
HRLZI B,LINTAB(ARRY1) ;RAW BYTE PNTR FOR ARRY1
MOVE F,T
ASH F,-1
ADD B,F
MOVE E,BPTAB(ARRY2) ;RAW BYTE PTR FOR ARRY2
MOVE E,-1(E)
ADD E,LINTAB(ARRY2)
COLP: HLRZ D,B
MOVE D,(D) ;CORRECTED BYTE PTR FOR ARRY1
MOVE C,E ;ACTUAL BYTE PTR FOR ARRY2
MOVN TT,LNBY(ARRY2) ;INNER LOOP COUNTER ON BYTES/LINE
HRLZ TT,TT
HRR TT,XTAB
ILNP: MOVE TTT,(TT)
ADD TTT,D
LDB F,TTT
LSH F,(G)
IDPB F,C
AOBJN TT,ILNP
ADD B,T
ADD E,LNWD(ARRY2)
AOJL A,COLP
MOVE THIS,XTAB
PUSHJ P,CORREL
JRST @RETAD
PRGEND
TITLE TEMP
ENTRY SQRS,TEMP
TEMP: BLOCK 50 ;TEMPORARY STORAGE FOR STUFF
FOR I←-77,-1,1 { I*4000000+I*I
}
SQRS: FOR I←0,77,1 { I*4000000+I*I
}
END